symbol 是否可以遍历
Object.keys、for in 遍历不出来 Symbol 如果想要遍历可以通过 Object.getOwnPropertySymbols() 或者通过 Reflect.ownKeys 遍历 但拥有 Symbol.iterator 属性的的可以遍历 数组、字符串、map
遍历
对于一个对象,在忽略其继承的属性的情况下,获取到的属性集合的数量排序为 Reflect.ownKeys > Object.getOwnPropertyNames(但包含所有不可枚举的属性组成的数组) > Object.keys(可枚举属性组) > Object.getOwnPropertySymbols
js
let mySymbol = Symbol();
console.log(typeof mySymbol[Symbol.iterator] === "function"); // false
Symbol 怎么用?是否可以为空?
- Symbol 定后值是唯一的,通常用于给对象添加唯一键值 (防止被覆盖)
- 它不用 new 会报错 new Symbol 报错
- for...in 不会遍历出来 Symbol 属性 (模拟类的私有方法)只能通过 Object.getOwnPropertySymbols
- JSON.stringify 完全忽略 Symbol
- 可以为空
js
let sym2 = Symbol("foo");
let sym3 = Symbol("foo");
Symbol("foo") === Symbol("foo"); // false
js
const obj = {
[Symbol.iterator]: function () {
return this;
},
next: function () {
return {
done: true,
value: 1,
};
},
};
Symbol.for 全局 symbol
- 该方法在 “全局 Symbol 注册中心” 创建了一个 Symbol .equal(Symbol.for('foo'), Symbol.for('foo'));
js
var myObj = {};
var fooSym = Symbol.for("foo");
var otherSym = Symbol.for("foo");
myObj[fooSym] = "baz";
myObj[otherSym] = "bing";
assert(fooSym === otherSym);
assert(myObj[fooSym] === "bing");
assert(myObj[otherSym] === "bing");
- 判断哪些 Symbol 是唯一的
js
var localFooSymbol = Symbol("foo");
var globalFooSymbol = Symbol.for("foo");
Symbol.keyFor(localFooSymbol) === undefined;
Symbol.keyFor(globalFooSymbol) === "foo";
Symbol.for(Symbol.keyFor(globalFooSymbol)) === Symbol.for("foo");